package pl.polsl.mmm.projectcomm.objects.MD5;

import pl.polsl.mmm.projectcomm.Constants;

/**
 * Created by Maciek on 2014-11-01.
 */
public class MD5Action {
    //nazwa akcji
    private String name;
    //ilość ramek w akcji
    private int nFrame;
    //tablica trzymająca kolejne zmiany położenia kości w kolejnych ramkach animacji
    private MD5Joint[][] frame;
    //tablica trzymająca aktualne położenie kości (aktualną pozę)
    private MD5Joint pose[];
    //obecny numer wyświetlanej ramki
    private int curr_frame;
    //następna ramka do wyświetlenia
    private int	next_frame;
    //obecny stan animacji: czy jest w toku, zastopowana itp...
    private Constants.ACTION_STATE	state;
    //metoda wyświetlania animacji. Tj. czy interpolować pomiędzy ramkami czy walić 'na surowo'
    private short method;
    //flaga czy animacja ma być powtarzana po zakończeniu
    private boolean	loop;
    //ilość czasu na 1 ramkę
    private float frameTime;
    //ilość ramek na sekundę
    private float fps;

    /** Metoda ustawiająca parametry animacji i uruchamiająca ją stanem PLAY */
    public void actionPlay (short frameInterpolationMethod, boolean loop) {
        this.method = frameInterpolationMethod;
        this.loop = loop;
        setState(Constants.ACTION_STATE.PLAY);

        if(frameTime == 0f && frameInterpolationMethod == Constants.MD5_METHOD_FRAME) {
            frameTime = fps;
        }
    }
    /** Metoda pauzująca animację */
    public void actionPause () {
        setState(Constants.ACTION_STATE.PAUSE);
    }
    /** Metoda zatrzymująca i resetująca animację */
    public void actionStop () {
        curr_frame = 0;
        next_frame = 1;
        setState(Constants.ACTION_STATE.STOP);
        frameTime = 0f;
    }
    /** Metoda do usuwania wszystkich pól/obiektów */
    public void clearUp () {
        frame = null;
        pose = null;
        name = null;
    }
    /** Metoda do alokowania tablicy wielowymiarowej z ramkami animacji */
    public void alocateFrame(int nFrame, int nJoint) {
        this.nFrame = nFrame;
        frame = new MD5Joint[nFrame][nJoint];
        for(int i = 0;i< nFrame;i++)
            for(int j = 0;j< nJoint;j++)
                frame[i][j] = new MD5Joint();
    }
    /** Metoda do alokowania tablicy z pozycjami */
    public void alocatePose(int nJoint) {
        pose = new MD5Joint[nJoint];
        for(int i = 0;i< nJoint;i++)
            pose[i] = new MD5Joint();
    }

    /*******************GETTERY I SETTERY**************************************************/
    public int getCurr_frame() {
        return curr_frame;
    }

    public void setCurr_frame(int curr_frame) {
        this.curr_frame = curr_frame;
    }

    public void incCurr_frame() { curr_frame++ ;}

    public int getNext_frame() {
        return next_frame;
    }

    public void setNext_frame(int next_frame) {
        this.next_frame = next_frame;
    }

    public void incNext_frame() {next_frame++;}

    public MD5Joint[] getPose() {
        return pose;
    }

    public void setPose(MD5Joint[] pose) {
        this.pose = pose;
    }

    public float getFps() {
        return fps;
    }

    public void setFps(float fps) {
        this.fps = 1.0f / fps;
    }

    public MD5Joint[][] getFrame() {
        return frame;
    }

    public void setFrame(MD5Joint[][] frame) {
        this.frame = frame;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Constants.ACTION_STATE getState() {
        return state;
    }

    public void setState(Constants.ACTION_STATE state) {
        this.state = state;
    }

    public float getFrameTime() {
        return frameTime;
    }

    public void setFrameTime(float frameTime) {
        this.frameTime = frameTime;
    }

    public int getnFrame() {
        return nFrame;
    }

    public void setnFrame(int nFrame) {
        this.nFrame = nFrame;
    }

    public boolean isLoop() {
        return loop;
    }

    public void setLoop(boolean loop) {
        this.loop = loop;
    }

    public short getMethod() {
        return method;
    }

    public void setMethod(short method) {
        this.method = method;
    }
}
